#include<iostream>
#define MAX 105
using namespace std;
int n, m, sum = -0x3f3f3f3f;
int map[MAX][MAX];
//next数组表示每一步可以向右，向下，向右两格，向下两格....九种走法
int nextt[9][2] = { {0,1},{1,0},{0,2},{2,0},{0,3},{3,0},{1,1},{1,2},{2,1} };
//如果不是右下角，则对每一种可能的移动方向进行遍历，计算下一步的坐标(tx, ty)，并递归调用dfs(tx, ty, value)，将当前位置的元素值加到value上。
void dfs(int x, int y,int value)
{
    value += map[x][y];
    if (x == n && y == m)
    {
        sum=max(sum,value);
        return;
    }

    for (int i = 0; i < 9; i++)
    {
        int tx = x + nextt[i][0];//向右走
        int ty = y + nextt[i][1];//向下走
        if (tx <= n && ty <= m)
            dfs(tx, ty, value);
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> map[i][j];
    dfs(1, 1, 0);
    cout << sum;
    return 0;
}